/**
 * # 数据实体类:
 *  Module - 模块
 * 
 * # 描述:
 *  表示 App 中的一个模块。
 *  
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

package com.waln.authority.apps.data;

/**
 * 模块。
 * 
 * 表示 App 中的一个模块。
 */
public final class Module extends pittypat.DataModel {
	/**
	 * Id。
	 */
	public java.util.UUID id;

	/**
	 * 隶属 App 的 Id。
	 * <p>
	 * 模块隶属的 App 的 Id。
	 */
	public java.util.UUID appId;

	/**
	 * 位置。
	 * <p>
	 * 模块在同一个 App 中先后显示顺序。
	 */
	public Short position;

	/**
	 * 标识符。
	 * <p>
	 * 模块的标识符。
	 */
	public String identifier;

	/**
	 * 模块名称。
	 * <p>
	 * 模块的名称。
	 */
	public String name;

	/**
	 * 呈现方式。
	 * <p>
	 * 指示模块应该如何对外呈现：0-Internal，1-UI，2-Service。
	 */
	public Byte presentation;

	/**
	 * 允许匿名访问。
	 * <p>
	 * 指示模块是否允许匿名用户访问和使用。
	 */
	public Boolean allowAnonymous;

	/**
	 * 描述。
	 * <p>
	 * 对模块的描述信息。
	 */
	public String description;

	/**
	 * 初始化 Module 类的一个新实例。
	 */
	public Module() {
		super();

		// Id
		this.id = null;
		// 隶属 App 的 Id
		this.appId = null;
		// 位置
		this.position = null;
		// 标识符
		this.identifier = null;
		// 模块名称
		this.name = null;
		// 呈现方式
		this.presentation = null;
		// 允许匿名访问
		this.allowAnonymous = null;
		// 描述
		this.description = null;
	}

	/**
	 * 从一个 DbDataReader 中读取此对象。
	 * 
	 * @param reader
	 * 			包含对象数据的 DbDataReader 对象。
	 * 
	 * @throws IllegalArgumentException
	 * 
	 * @see pittypat.DataModel#read(pittypat.data.DbDataReader)
	 * @see pittypat.data.DbDataReader
	 */
	@Override
	public void read(pittypat.data.DbDataReader reader) throws IllegalArgumentException {
		if (reader == null) {
			throw new IllegalArgumentException("reader 为 null。");
		}

		// Id
		this.id = reader.getUuid("id", this.id);
		// 隶属 App 的 Id
		this.appId = reader.getUuid("appId", this.appId);
		// 位置
		this.position = reader.getShort("position", this.position);
		// 标识符
		this.identifier = reader.getString("identifier", this.identifier);
		// 模块名称
		this.name = reader.getString("name", this.name);
		// 呈现方式
		this.presentation = reader.getByte("presentation", this.presentation);
		// 允许匿名访问
		this.allowAnonymous = reader.getBoolean("allowAnonymous", this.allowAnonymous);
		// 描述
		this.description = reader.getString("description", this.description);
	}

	/**
	 * 将当前对象作为 JSON 字符串写入指定的文本流。
	 * 
	 * @param writer
	 * 			目标文本流。
	 * 
	 * @throws IllegalArgumentException
	 * @throws java.io.IOException
	 * 
	 * @see pittypat.DataModel#write(java.io.Writer)
	 */
	@Override
	public void write(java.io.Writer writer) throws IllegalArgumentException, java.io.IOException {
		if (writer == null) {
			throw new IllegalArgumentException("writer 为 null。");
		}

		writer.write('{');

		// Id
		writer.write("\"id\":");
		pittypat.Json.write(writer, this.id);
		writer.write(',');

		// 隶属 App 的 Id
		writer.write("\"appId\":");
		pittypat.Json.write(writer, this.appId);
		writer.write(',');

		// 位置
		writer.write("\"position\":");
		pittypat.Json.write(writer, this.position);
		writer.write(',');

		// 标识符
		writer.write("\"identifier\":");
		pittypat.Json.write(writer, this.identifier);
		writer.write(',');

		// 模块名称
		writer.write("\"name\":");
		pittypat.Json.write(writer, this.name);
		writer.write(',');

		// 呈现方式
		writer.write("\"presentation\":");
		pittypat.Json.write(writer, this.presentation);
		writer.write(',');

		// 允许匿名访问
		writer.write("\"allowAnonymous\":");
		pittypat.Json.write(writer, this.allowAnonymous);
		writer.write(',');

		// 描述
		writer.write("\"description\":");
		pittypat.Json.write(writer, this.description);

		writer.write('}');
	}
}
